home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Reference Guide
/
C-C++ Interactive Reference Guide.iso
/
c_ref
/
csource5
/
344_01
/
pb.c
< prev
next >
Wrap
Text File
|
1989-10-29
|
5KB
|
244 lines
/*
* HEADER: ;
* TITLE: Phone Book;
* DATE: 10/28/89;
* DESCRIPTION: "quick and dirty telephone directory to
* illustrate the use of blksplit() & stristr()";
* VERSION: 1.0;
* FILENAME: PB.C;
* USAGE: PB [search string];
* SEE-ALSO: STRISTR.C, BLKSPLIT.C;
* AUTHORS: Michael Kelly;
* WARNINGS: "Requires STRISTR.OBJ and BLKSPLIT.OBJ.
* Telephone data file must be ASCII text with
* one record per line.
* Data file name is #defined as FILENAME";
*
* COMMENTS: Tested using TubroC V 2.0 Large Model.
* Should be easy port to any ANSI C;
*/
/*
* *** Phone Book ***
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "blksplit.h"
#include "stristr.h"
/* #define DEBUG 1 */
/*
* maximum # of char * in array
*/
#define MAX_PHONE_NUMS 500
/*
* Phone Book data file
*/
#define FILENAME "phonebk.dat"
/*
* maximum length of substring + 1
*/
#define REPLY_SIZE 128
/*
* module functions
*/
static void error_exit(char *errormsg, int line_no);
static int get_data(void);
/*
* global variables
*/
FILE *fp;
char filename[] = FILENAME;
char diskbuf[BUFSIZ];
long length = 0L;
char **phonenum;
char *buffer;
/*
* set record_sep to end of line delimiter(s) used on your file system
*/
#if defined(__MSDOS__)
char record_sep[] = "\r\n";
#else
char record_sep[] = "\n";
#endif
/*
* Main
*/
int main(int argc, char *argv[])
{
register int num_rec = 0, cur_rec = 0;
int matches = 0;
char reply[REPLY_SIZE] = "";
phonenum = (char **) calloc(MAX_PHONE_NUMS,sizeof(char *));
if(!phonenum)
error_exit("Not enough memory : Program terminating.",__LINE__);
num_rec = get_data();
if(num_rec < 1)
error_exit("Data file " FILENAME " invalid!",__LINE__);
#ifdef DEBUG
for(cur_rec = 0;cur_rec < num_rec;cur_rec++) {
size_t k;
k = strlen(phonenum[cur_rec]);
if(k) --k;
printf("\n%s\nFirst char = %d Last char = %d",
phonenum[cur_rec],phonenum[cur_rec][0],
phonenum[cur_rec][k]
);
}
printf("\n\tNum records = %d\n",num_rec);
gets(reply);
#endif
if(num_rec < 1)
error_exit("Data file " FILENAME " invalid!",__LINE__);
printf("\n\n\t\t\tP h o n e B o o k\n");
/*
* command process loop
*/
do {
if(argc < 2) {
printf("\n\t\t*** Press <Enter> to Quit ***");
printf(
"\n\n\tEnter search string { not case sensitive }\n\n\t> "
);
gets(reply);
reply[REPLY_SIZE] = '\0';
}
else {
strncpy(reply,argv[1],REPLY_SIZE - 1);
--argc;
}
if(!*reply)
break;
matches = 0;
printf("\n");
for(cur_rec = 0;cur_rec < num_rec;cur_rec++)
if(stristr(phonenum[cur_rec],reply)) {
matches++;
printf("\n%s",phonenum[cur_rec]);
}
printf("\n\n\t%d record(s) matching \n\t> %s\n",matches,reply);
} while(*reply);
if(phonenum)
free(phonenum);
if(buffer)
free(buffer);
return(EXIT_SUCCESS);
}
/*
* support functions
*/
/*
* display error message and exit
*/
static void error_exit(char *errormsg, int line_no)
{
fprintf(stderr,"\n\t%s",errormsg);
#ifdef DEBUG
if(line_no)
fprintf(stderr,"\t(# %d)\n",line_no);
#endif
exit(EXIT_FAILURE);
}
/*
* gets file size, allocates memory for and reads data file, then
* calls blksplit() to store address of each record.
*
* returns # of file lines read
*
*/
static int get_data()
{
fp = fopen(filename,"rb");
if(!fp)
error_exit("Cannot open " FILENAME,__LINE__);
/*
* determination of file length may not be portable
*/
length = lseek(fileno(fp),0L,SEEK_END);
rewind(fp);
if(length == -1L)
error_exit("Error determining input file length",__LINE__);
else {
/*
* allocate extra byte so block is NULL terminated
*/
buffer = (char *) calloc(1,(size_t)(length + 1));
if(!buffer)
error_exit("Not enough memory : Program terminating.",__LINE__);
if(setvbuf(fp,diskbuf,_IOFBF,BUFSIZ))
error_exit("Data file buffer error",__LINE__);
if(!fread(buffer,(size_t)length,1,fp))
error_exit("Error reading data file.",__LINE__);
fclose(fp);
}
return(blksplit(buffer,phonenum,record_sep,MAX_PHONE_NUMS));
}